<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Promisification</title>
</head>
<body>
<script>
  /*
  * Promise不是用来取代回调函数的，而是优化回调函数内的第二次操作
  * 回调函数是无法被优化的，JS的异步操作都是基于回调函数
  *
  * Promise化虽然我们不用写回调函数了，但是Promise内部还是要给我们调用回调函数
  *
  * */

  function calc(num,fn) {
    setTimeout(()=>{
      if (num<10){
        fn(false)
      }else{
        fn(undefined,true)
      }
    })
  }

calc(11,(err,data) =>{
  if (err){
    console.log(err);
  }else{
    console.log(data);
  }

})

  function promiseCalc(num) {
     return new Promise(((resolve, reject) => {
       calc(num,(err,data)=>{
         if (err){
           reject(err)
         }else{
           resolve(data)
         }
       })
     }))
  }


  /*
  * 将任意的函数包装成Promise的难点在于,既然要被Promise包装那么函数一定是回调函数
  * 也就是我们要在new Promise()内部调用函数的回调函数但这里的问题是只传递一个f过来我们根本拿不到原函数的回调函数

  * */
  function promisify(f) {
    return function (...args) {
      return new Promise((resolve, reject) => {
        /*
        * 虽然我们拿不到原函数的回调函数但是可以造一个出来，把这个函数当成原函数的回调函数去使用
        * 然后把这个函数加到原函数的参数列表中去调用，那么原函数就可以完整调用了
        * */
        function callback(err, result) {
          if (err) {
            reject(err);
          } else {
            resolve(result);
          }
        }

        args.push(callback);

        f.call(this, ...args);
      });
    };
  }


</script>
</body>
</html>